package com.example.service;

import com.example.dao.AdminInfoDao;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.example.entity.AdminInfo;
import com.example.exception.CustomException;
import com.example.common.ResultCode;
import com.example.vo.AdminInfoVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cn.hutool.crypto.SecureUtil;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 管理员信息服务层
 * <p>
 * 处理管理员账号相关的业务逻辑，包括增删改查、分页查询、登录验证等功能
 * </p>
 */
@Service
public class AdminInfoService {

    @Resource
    private AdminInfoDao adminInfoDao;
    /**
     * 添加新管理员
     *
     * @param adminInfo 管理员实体对象（需包含name和password字段）
     * @return 插入后的管理员实体（包含自增ID）
     * @throws CustomException 当用户名已存在时抛出业务异常
     */
    public AdminInfo add(AdminInfo adminInfo) {
        // 唯一校验
        int count = adminInfoDao.checkRepeat("name", adminInfo.getName(), null);
        if (count > 0) {
            throw new CustomException("1001", "用户名\"" + adminInfo.getName() + "\"已存在");
        }
        if (StringUtils.isEmpty(adminInfo.getPassword())) {
            // 默认密码123456
            adminInfo.setPassword(SecureUtil.md5("123456"));
        } else {
            adminInfo.setPassword(SecureUtil.md5(adminInfo.getPassword()));
        }
        adminInfoDao.insertSelective(adminInfo);
        return adminInfo;
    }

    /**
     * 逻辑删除管理员（根据ID）
     *
     * @param id 要删除的管理员ID
     */
    public void delete(Long id) {
        adminInfoDao.deleteByPrimaryKey(id);
    }

    /**
     * 更新管理员信息
     *
     * @param adminInfo 包含更新字段的管理员实体（ID必填）
     */
    public void update(AdminInfo adminInfo) {
        adminInfoDao.updateByPrimaryKeySelective(adminInfo);
    }

    /**
     * 根据ID查询管理员详情
     *
     * @param id 管理员ID
     * @return 对应的管理员实体对象
     */
    public AdminInfo findById(Long id) {
        return adminInfoDao.selectByPrimaryKey(id);
    }

    /**
     * 查询所有管理员信息
     *
     * @return 管理员视图对象列表
     */
    public List<AdminInfoVo> findAll() {
        return adminInfoDao.findByName("all");
    }


    /**
     * 分页查询管理员列表
     *
     * @param name     查询关键字（支持用户名模糊查询）
     * @param pageNum  当前页码（从1开始）
     * @param pageSize 每页显示数量
     * @param request  HTTP请求对象（预留参数，当前未使用）
     * @return 分页结果包装对象（包含数据列表和分页信息）
     */
    public PageInfo<AdminInfoVo> findPage(String name, Integer pageNum, Integer pageSize, HttpServletRequest request) {
        PageHelper.startPage(pageNum, pageSize);
        List<AdminInfoVo> all = adminInfoDao.findByName(name);
        return PageInfo.of(all);
    }

    /**
     * 根据用户名查询管理员
     *
     * @param name 用户名
     * @return 对应的管理员视图对象（包含扩展信息）
     */
    public AdminInfoVo findByUserName(String name) {

        return adminInfoDao.findByUsername(name);
    }

    /**
     * 管理员登录验证
     *
     * @param username 用户名
     * @param password 密码（明文）
     * @return 验证通过的管理员实体
     * @throws CustomException 当账号不存在或密码错误时抛出
     */
    public AdminInfo login(String username, String password) {
        AdminInfo adminInfo = adminInfoDao.findByUsername(username);
        if (adminInfo == null) {
            throw new CustomException(ResultCode.USER_ACCOUNT_ERROR);
        }
        if (!SecureUtil.md5(password).equalsIgnoreCase(adminInfo.getPassword())) {
            throw new CustomException(ResultCode.USER_ACCOUNT_ERROR);
        }
        return adminInfo;
    }

}
